自定义SpringBoot组件

1.引入Maven依赖

1
2
3
4
5
6
7
8
9
10
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>

这里说下artifactId的命名问题,Spring 官方 Starter通常命名为spring-boot-starter-{name}如 spring-boot-starter-web,Spring官方建议非官方Starter命名应遵循{name}-spring-boot-starter的格式。

logback简单使用

1.logback的pom依赖

1
2
3
4
5
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>

Spring Cloud-使用config类配置tomcat

1.起因

    公司开发一个系统,采用的是Spring Cloud开发。在项目部署时需要在一台机器启动多个相同的服务,为了避免修改配置文件,使用config来配置tomcat。结果导致了注册到eureka的服务错误,在使用feign进行调用时出现错误。

SpringBoot整合Swagger2

一、依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.5.0</version>
</dependency>

数据结构之排序

数据结构和算法是整个计算机科学与技术领域永远逃避不了的话题,博主大学有过数据结构这门学科,不过特别后悔当时没有好好学习.仅学的那么点东西现在几乎忘得一干二净.虽说学的浅薄,但对整个编程思想还是很有帮助的.

十种常见排序算法

十种常见排序算法可分为两大类:

  • 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序.
  • 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序.

内网穿透神器-Ngrok

引入

作为一个Web开发者,我们有时候会需要临时地将一个本地的Web网站部署到外网,以供他人体验评价或协助调试等等,通常我们会这么做:

  1. 找到一台运行于外网的Web服务器;
  2. 服务器上搭建网站运行时的环境;
  3. 部署网站
  4. 调试结束后,再将网站从服务器上删除
    我们部署静态的网站仅仅只是需要展示给朋友,何必那么麻烦???
    除此之外,笔者最近进行微信机器人开发,经常在本地开发和微信服务端进行联调.由于微信端口和网络的限制(微信公众平台开发对接必须以http://或https://开头,分别支持80端口和443端口),我不得不将我的内网映射到公网地址做映射调试.
    有了Ngrok之后,世界是如此的美好,所以开始学习之旅吧!

单例模式-Spring单例实现原理分析

在Spring中,被@Scope注解修饰Bean默认是单例模式的,即只有一个实例对象,多次获取Bean会拿到同一个对象.

单例注册表

Spring采用单例注册表的特殊方式实现单例模式.首先自己写个单例注册表.我们可以通过Map缓存单例对象,实现单例注册表.值得注意的是,采用ConcurrentHashMap是出于线程安全的考虑.

线程切换导致ThreadLocal数据丢失分析

最近在使用Spring Cloud过程中,经常会遇见线程隔离(切换).导致ThreadLocal数据丢失.例如调用其他服务获取不到Threadlocal没有数据,服务之间传递请求头传递失败.通过查阅相关文档才发现:
用Hystrix实现断路器,Zuul中默认使用的是信号量,其他默认都是线程隔离.具体文档如下(可参考Hystrix WIKI):

Thread or Semaphore

  • The default, and the recommended setting, is to run HystrixCommands using thread isolation (THREAD) and HystrixObservableCommands using semaphore isolation (SEMAPHORE).
  • Commands executed in threads have an extra layer of protection against latencies beyond what network timeouts can offer.
  • Generally the only time you should use semaphore isolation for HystrixCommands is when the call is so high volume (hundreds per second, per instance) that the overhead of separate threads is too high; this typically only applies to non-network calls.

在使用线程隔离的时候,有个问题是必须要解决的,那就是在某些业务场景下通过ThreadLocal来在线程里传递数据,用信号量是没问题的,从请求进来,但后续的流程都是通一个线程。
当隔离模式为线程时,Hystrix会将请求放入Hystrix的线程池中去执行,这个时候某个请求就有A线程变成B线程了,ThreadLocal必然消失了.

使用Jenkins进行持续集成

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

安装Jenkins

首先我们去Jenkins官方网站下载最新的部署包(.war):Jenkins.
因为我是在Linux平台部署,需要注意的是Jenkins是基于Java构建的,所以我们必须安装好JDK系列的依赖才行.
Linux安装JDK时候先卸载本身自带的OpenJDK再进行安装,并配置好环境变量.JDK安装我不在累述,读者可自行百度.

浅谈匿名函数,Lambda和闭包(Closure)

几乎所有的主流编程语言都对函数式编程有支持,我所用过的比如Java8的Lambda表达式,JavaScript和Groovy语言的闭包(Closure)等,其他的类似于Object-C的block,python的Lambda和C++11,看到这些,我都有点眩晕想吐的感觉.

匿名函数,Lambda,闭包(Closure)区别

从表象上说Lambda和Closure是一个东西,只是语言不同罢了,它们都可以去替代匿名函数用于简化书写,匿名函数内部可以访问到外部变量.从而形成一个”闭包”.记住,这只是表象.下面就让你怀疑人生?真的是一样吗?

Java中Lambda表达式浅谈

其实Java在很早的版本就支持闭包,只是因为应用场景太少了,所以这个概念才从Java8推广.
话不多说,先上代码: